#ifndef __LEX_H_
#define __LEX_H_
#include "stdint.h"
#include "symbol.h"

typedef struct _input_buf_st input_buf_st;

typedef struct _lex_st lex_st;
struct _lex_st
{
    uint32_t line;                  //<! 行数
    symbol_st *lookahead_symbol;    //<! 向前看的符号
    input_buf_st *input_buf;        //<! 输入缓冲
    symbol_st symbol;               //<! 符号结构体，避免每次申请内存
};

/**
 * @brief Get the next symbol object
 *
 * @param input_buf 输入数据结构体
 * @return lex_st* NULL: 没有获取到lex; 解析得到的lex
 */
symbol_st *lex_get_symbol(
    lex_st *lex);

/**
 * @brief 将look ahead的symbol放回到lex中
 *
 * @param lex 待操作的lex_st结构体指针
 * @param symbol 待放回的symbol
 * @return int32_t: 0 放回成功; <0 放回失败
 */
int32_t lex_put_symbol(
    lex_st *lex,
    symbol_st *symbol);

/**
 * @brief 释放lex_st结构体
 *
 * @param lex 待释放的lex_st结构体指针
 */
void lex_free(
    lex_st *lex);

/**
 * @brief 根据测试文件路径，初始化一个lex
 *
 * @param path 测试文件路径
 * @return lex_st* 申请的lex结构体
 */
lex_st *lex_malloc(
    char *path);

/**
 * @brief lex_st 测试函数
 *
 */
void lex_test(
    void);

#endif